package com.fy.utils;

import com.fy.config.FileConfig;
import com.google.gson.JsonObject;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 
 * @ClassName com.supergenius.sns.util.image.FileUtil
 * @description kindeditoe文件上传类
 * @author : qinggang.liu 305050016@qq.com
 * @Create Date : 2013-12-13 下午2:49:02
 */
public class FileUtil {

    private static Logger logger = LoggerFactory.getLogger(FileUtil.class);


    // 统一传到upload下
    public static final String pathfix = "upload";//

    /**
     * 获得存储的物理路径
     *
     * @param request
     * @return
     */
    public static String[] getSavePathByRequest(HttpServletRequest request,FileConfig fileConfig) {

        String base = request.getParameter("base");// 区分项目的变量 如：恒企、仁和等区分
        if (StringUtils.isEmpty(base)) {
            base = "imgdefault";// 临时，未传次参数的项目统一到此目录下
        }
        String param = request.getParameter("param");// 区分模块的变量 如：考试、商品、课程等区分
        if (StringUtils.isEmpty(param)) {
            param = "common";// 临时，未传的项目统一到common目录下
        }
        String dateStr = DateUtils.toString(new Date(), "yyyyMMdd");
        String ukey = request.getParameter("ukey");// 用户唯一key
        StringBuffer savePath = new StringBuffer();
        StringBuffer urlPath = new StringBuffer();

        //物理savePath
        savePath.append(fileConfig.getProfile()).append("/").append(pathfix)
                .append("/"  ).append(base)
                .append("/"  ).append(param);
        //url
        urlPath.append( "/").append(pathfix)
                .append("/"  ).append(base)
                .append("/"  ).append(param);

        if (StringUtils.isNotEmpty(ukey)) {
            savePath.append("/"  ).append(ukey);
            urlPath.append("/"  ).append(ukey);
        }
        savePath.append("/"  ).append(dateStr);
        urlPath.append("/"  ).append(dateStr);

        String[] result = new String[] { savePath.toString(), urlPath.toString() };
        return result;
    }


    /**
     *  上传普通文件,不限制文件名后缀
     *
     * @param file
     *            文件
     * @param paths
     *            路径 0物理 1 URL
     * @returned JsonObject
     */
    public static JsonObject saveCommonFile(MultipartFile file, String[] paths) {

        JsonObject obj = new JsonObject();
        try {
            // 存储物理路径
            String savePath = paths[0];
            // 返回的url
            String urlPath = paths[1];
            String newFileName = "";// 新的文件名
            String upFileName = file.getOriginalFilename();
            if (StringUtils.isNotEmpty(upFileName)) {
                // 新文件名
                newFileName = getRandomFileNameString(upFileName);
                // 锁结束
                File isD = new File(savePath);
                // 校验如果目录不存在，则创建目录
                if (!isD.isDirectory()) {
                    isD.mkdirs();
                }
                if (!isD.exists()) {
                    synchronized (FileUtil.class) {
                        isD.mkdirs();
                    }
                }
                String saveFilename = savePath + File.separator + newFileName;
                // 保存文件
                file.transferTo(new File(saveFilename));
                obj.addProperty("error", 0);
                urlPath = urlPath + "/" + newFileName;
                obj.addProperty("url", urlPath);
            } else {
                obj.addProperty("error", -1);
                obj.addProperty("message", "文件名为空");
            }

            return obj;

        } catch (Exception e) {
            logger.error("+++upload kindeditor images error", e);
            obj.addProperty("error", -1);
            obj.addProperty("message", "上传异常，请稍后再试");
            return obj;
        }
    }


    /**
     * 获得随机的数字为文件名，有效防止文件名重读
     *
     * @param fileName
     *            传来的文件名
     * @return String 返回新的文件名
     */
    public static String getRandomFileNameString(String fileName) {

        StringBuffer buffer = new StringBuffer();
        // 加锁为防止文件名重复
        final Lock lock = new ReentrantLock();
        lock.lock();
        try {
            buffer.append(System.currentTimeMillis());// 当前时间
            // 增加6位随机的数字
            buffer.append(getRandomString(6));
            // 添加后缀名
            buffer.append(fileName.substring(fileName.lastIndexOf("."), fileName.length()));
        } finally {
            lock.unlock();
        }
        return buffer.toString();
    }


    /**
     * 获取指定长度的随机数字
     *
     * @param len
     * @return
     */
    public static String getRandomString(int len) {
        Random random = new Random();
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < len; i++) {
            buffer.append(random.nextInt(10));
            random = new Random();
        }
        return buffer.toString();
    }

}
